package com.chengxiaoxiao.ai_demo.controller;

import com.chengxiaoxiao.ai_demo.vo.form.ChatForm;
import com.google.common.collect.Lists;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.ai.ollama.api.OllamaOptions;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.util.List;

@RestController
@RequestMapping("/chat")
@Tag(name = "聊天")
public class ChatController {
    @Resource
    private OllamaChatModel ollamaChatModel;

    /**
     * 处理聊天请求并返回模型生成的回复
     *
     * @param chatForm 包含用户消息的请求体对象
     *                 （参数说明：使用@RequestBody注解自动反序列化请求体为ChatForm对象，
     *                 应包含用户输入的文本内容）
     * @return 模型生成的回复内容字符串
     * （返回值说明：通过ollamaChatModel处理用户消息后返回的文本结果）
     */
    @Operation(summary = "聊天-同步")
    @PostMapping
    public String chat(@RequestBody ChatForm chatForm) {
        // 调用AI聊天模型处理用户输入文本，返回生成的回复
        return this.ollamaChatModel.call(chatForm.getText());
    }

    /**
     * 处理聊天请求并使用流式方式返回模型生成的回复
     *
     * @param chatForm 包含用户消息的请求体对象
     * @return 模型生成的回复内容字符串
     */
    @Operation(summary = "聊天-流式")
    @PostMapping("/stream")
    public Flux<ChatResponse> chatStream(@RequestBody ChatForm chatForm) {
        // 设置参数
        OllamaOptions options = OllamaOptions.builder()
                .model("qwen2.5:0.5b")
                .temperature(0.3)
                .build();
        List<Message> abstractMessages = Lists.newArrayList(new SystemMessage("你是一个说话少的人，每次回复不超过5个字"), new UserMessage(chatForm.getText()));
        Prompt prompt = new Prompt(abstractMessages, options);
        return ollamaChatModel.stream(prompt);
    }

    /**
     * 使用大模型修正语音输入的文字
     *
     * @param message 文字
     * @return 模型生成的回复内容字符串
     */
    @Operation(summary = "使用大模型修正语音输入的文字")
    @PostMapping("/fix-text")
    public String chatStream(@RequestBody String message) {
        // 设置参数
        OllamaOptions options = OllamaOptions.builder()
                .model("qwen2.5:0.5b")
                .temperature(0.8)
                .build();

        String systemMessage = "用户给你提供的是语音识别的一些文字，这些文字可能存在断句问题和错别字。" +
                "错别字可能是识别成拼音相近的字了，您的任务是从读音和上下文仔细检查提供的文本内容，" +
                "对这些文字进行必要的修改以确保其语法正确、通顺连贯，并能准确传达原意。" +
                "直接返回修复结果，语言类型保持和用户的一致";

//        //定义系统角色
//        String systemMessage = "你是一款语言辅助工具，旨在校正和优化语音识别系统输入的文本。您的任务是仔细检查提供的文本内容，" +
//                "进行必要的修改以确保其语法正确、通顺连贯，并能准确传达原意。" +
//                "对于不通顺的词语，考虑到拼音相同或多音字的进行替换。删除 不必要的特殊符号，" +
//                "请直接提供修正后的文本作为回复,如果所输入的文本通顺无问题，请直接回复原文本";

        //定义用户消息
        String userMessage = "需要校正的内容为: '" + message + "'";
        Prompt prompt = new Prompt(
                Lists.newArrayList(new SystemMessage(systemMessage), new UserMessage(userMessage)),
                options);

        return ollamaChatModel.call(prompt).getResult().getOutput().getText();
    }
}
